package test;

import java.lang.reflect.Field;

/**
 * @Author: ideaAdmin
 * TODO:通过反射来不更改内存地址的同时 更改字符串
 * Date: 2022/2/11:20:50
 * Description:
 */

public class StringAndReflex {
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        setString();
    }
    public static void setString() throws NoSuchFieldException, IllegalAccessException {
        String str = new String("abcd");

        System.out.println("当前字符串" + str );
        System.out.println("地址" + str.hashCode());

        //获得此对象的 class
        Class<? extends String> stringClass = str.getClass();

        //getDeclaredFiled 仅能获取类本身的属性成员（包括私有、共有、保护）
        //getField 仅能获取类(及其父类可以自己测试) public属性成员
        //这里这个属性是私有的 需要用getDeclaredFiled
        Field stringField = stringClass.getDeclaredField("value");

        //设置访问权限
        stringField.setAccessible(true);

        //field.get()方法 返回指定对象obj上此 Field 表示的字段的值
        char[] value = (char[]) stringField.get(str);
        value[2] = 'd';

        System.out.println("当前字符串" + str );
        System.out.println("地址" + str.hashCode());


    }
}
